package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IChannelCompanyDAO;
import org.jsola.hr.dto.ChannelCompanyAddDTO;
import org.jsola.hr.dto.ChannelCompanyUpdateDTO;
import org.jsola.hr.entity.ChannelCompanyDO;
import org.jsola.hr.query.ChannelCompanyQuery;
import org.jsola.hr.vo.ChannelCompanyListVO;
import org.jsola.hr.vo.ChannelCompanyVO;
import org.jsola.hr.vo.ChildCompanyListVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 渠道用工单位
 *
 * @author zhr
 */
public interface IChannelCompanyService extends IService<IChannelCompanyDAO, ChannelCompanyDO> {

    /**
     * 新增渠道用工单位
     *
     * @param channelCompanyAddDTO 新增渠道用工单位DTO
     * @param tokenUser            当前用户
     * @return 渠道用工单位详情信息
     */
    ChannelCompanyVO save(ChannelCompanyAddDTO channelCompanyAddDTO, TokenUser tokenUser);

    /**
     * 批量新增渠道用工单位
     *
     * @param channelCompanyAddDTOList 新增渠道用工单位DTO
     * @param tokenUser                当前用户
     * @return 渠道用工单位详情信息
     */
    List<ChannelCompanyVO> batchSave(List<ChannelCompanyAddDTO> channelCompanyAddDTOList, TokenUser tokenUser);

    /**
     * 修改渠道用工单位
     *
     * @param channelCompanyUpdateDTO 修改渠道用工单位DTO
     * @param tokenUser               当前用户
     * @return 更新数量
     */
    int update(ChannelCompanyUpdateDTO channelCompanyUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除渠道用工单位，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser         当前用户
     * @param channelCompanyIds 渠道用工单位id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... channelCompanyIds);

    /**
     * 根据渠道用工单位id查找
     *
     * @param channelCompanyId 渠道用工单位id
     * @param siteId           所属站点id
     * @return 渠道用工单位详情信息
     */
    ChannelCompanyVO selectById(String channelCompanyId, String siteId);

    /**
     * 查询渠道用工单位
     *
     * @param channelCompanyQuery 查询条件
     * @param siteId              所属站点id
     * @return 渠道用工单位列表信息
     */
    List<ChannelCompanyListVO> select(ChannelCompanyQuery channelCompanyQuery, String siteId);

    /**
     * 查询渠道用工单位记录数
     *
     * @param channelCompanyQuery 查询条件
     * @param siteId              所属站点id
     * @return 渠道用工单位记录数
     */
    int selectCount(ChannelCompanyQuery channelCompanyQuery, String siteId);

    /**
     * 分页查询渠道用工单位
     *
     * @param channelCompanyQuery 查询条件
     * @param siteId              所属站点id
     * @return 渠道用工单位列表信息
     */
    Page<ChannelCompanyListVO> selectPage(ChannelCompanyQuery channelCompanyQuery, String siteId);


    /**
     * 根据渠道用工单位id查找
     *
     * @param channelCompanyId 渠道用工单位id
     * @param siteId           所属站点id
     * @return 渠道用工单位
     */
    ChannelCompanyDO selectDOById(String channelCompanyId, String siteId);

    /**
     * 查询渠道用工单位
     *
     * @param channelCompanyQuery 查询条件
     * @param siteId              所属站点id
     * @return 渠道用工单位列表
     */
    List<ChannelCompanyDO> selectDO(ChannelCompanyQuery channelCompanyQuery, String siteId);

    /**
     * 新增渠道分管用工单位
     *
     * @param channelId          渠道人员Id
     * @param isAllChildCompany  是否有站点权限
     * @param childCompanyIdList 用工单位分组Ids
     * @param employerIdList     用工单位ids
     * @param tokenUser          当前登录用户
     */
    void saveChannel(String channelId, Boolean isAllChildCompany, List<String> childCompanyIdList
            , List<String> employerIdList, TokenUser tokenUser);

    /**
     * 修改渠道分管用工单位
     *
     * @param channelId          渠道人员Id
     * @param isAllChildCompany  是否有站点权限
     * @param childCompanyIdList 用工单位分组Ids
     * @param employerIdList     用工单位ids
     * @param tokenUser          当前登录用户
     */
    void saveOrUpdateChannel(String channelId, Boolean isAllChildCompany, List<String> childCompanyIdList
            , List<String> employerIdList, TokenUser tokenUser);


    /**
     * 查询渠道用工单位
     *
     * @param channelId 渠道Id
     * @param siteId    站点Id
     * @return 渠道用工单位
     */
    List<ChannelCompanyVO> selectByChannelId(String channelId, String siteId);

    /**
     * 查询渠道分管用工单位
     *
     * @param channelIds 渠道Id
     * @param siteId     站点Id
     * @return 渠道分管用工单位
     */
    List<ChannelCompanyVO> selectByChannelIds(List<String> channelIds, String siteId);


    /**
     * 查询渠道关联公司
     *
     * @param channelCompanyVOList 渠道用工单位
     * @param siteId               站点Id
     * @return 渠道关联公司
     */
    List<ChildCompanyListVO> selectChildCompanyByChannelCompanyList(List<ChannelCompanyVO> channelCompanyVOList, String siteId);

    /**
     * 查询渠道负责的用工单位集合
     * @param userId
     * @param siteId
     * @return
     */
    List<String> selectCompanyIdsByUserId(String userId, String siteId);
}


